package 左哥算法.ch17技巧篇.打印题;

import org.junit.Test;

/**
 * 将打印拆分为多个模块，去考虑如何遍历这些模块。
 * 例如打印一个菱形，可以分为3个模块。
 * 分别是遍历每一层的模块、打印该层空格的模块，打印该层星号的模块。
 * 遍历模块获取当前层，给空格模块和星号模块传参，空格模块和星号模块根据参数计算出需要打印的数量。
 */
public class Ch01旋转打印矩阵 {

    /**
     * Ch01旋转打印一个矩阵。
     */
    @Test
    public void ch01(){
        int[][] matrix = {
                { 1, 2, 3, 4 },
                { 5, 6, 7, 8 },
                { 9, 10, 11, 12 }
        };
        ch01Fun(matrix);
    }
    public void ch01Fun(int[][] matrix){
        int x0=0,y0=0;
        int x1= matrix.length-1, y1=matrix[0].length-1;
        while (x0<=x1&&y0<=y1){
            print(matrix,x0,y0,x1,y1);
            x0++;x1--;
            y0++;y1--;
        }
    }
    /**
     * 给定左上角和右下角坐标
     * 分4个模块打印
     */
    public void print(int[][] matrix, int x0,int y0,int x1,int y1){
        int x=x0,y=y0;
        while (y<y1){
            System.out.println(matrix[x0][y++]);
        }
        while (x<x1){
            System.out.println(matrix[x++][y1]);
        }
        x=x1;y=y1;
        while (y0<y){
            System.out.println(matrix[x1][y--]);
        }
        while (x0<x){
            System.out.println(matrix[x--][y0]);
        }
    }
}
